
import java.io.File;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;

import com.feib.soeasy.model.Payment;




@Service("transferJob")
public class TransferJob {

	public final static Logger logger = LoggerFactory.getLogger(TransferJob.class);

	public static final SimpleDateFormat BASIC_DATE_TIME_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

	private static ApplicationContext SPRING_CTX = null;


	private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

	@Resource(name="backupBaseDirectory")
	private String backupBaseDirectory;



	/** 輸入參數對應的 指定檔案類型，參數代號規則同 FILE_FORMAT */
	private static Map<Integer,String> PaymentTable_Field =  new HashMap<Integer, String>();
	static{
		PaymentTable_Field.put(0, "超商");
		PaymentTable_Field.put(1, "郵局");
	}
	

	/**
	 * 1.每日批次 輸入一個傳輸日期 扣一入多
	 *   1-1 作超商扣P1003_eBilling_yyyymmdd.TXT 當天若有10家業者要撥款，若這10家業者4超商皆有回饋，撥款照理說會有40筆款項
	 *   但扣款就是這40筆加總成為一筆扣掉，也就是說扣款檔只會有一筆，備註寫「超商XXX筆」(XXX不是40筆，是代收筆數的量)。
	 *   1-2 作超商撥P1003_eBilling_yyyymmdd.TXT 入多 「統一」+「xxxxxx」+「筆」
		 1-3 郵局 A1002_eBilling_yyyymmdd.TXT 扣多入多
	 * 2. 畫面上區間傳輸日期(fb_time) group by 帳單業者
	 * 
	 * 
	 * 
	 * 3. 畫面上區間撥款日期
	 *     
	 * 
	 * @param args array, args[0]  args[1]<br>
	 */
	public static void main(String[] args) {

		SPRING_CTX = new ClassPathXmlApplicationContext(
				new String[] {"applicationContext-config.xml",	"applicationContext-dao.xml", "applicationContext-properties.xml"});


		Date start = new Date();
		logger.info("[開始]  批次  - {}", BASIC_DATE_TIME_FORMAT.format(start));

		try 
		{
			TransferJob job = (TransferJob)SPRING_CTX.getBean("transferJob");

			/* 根據參數 判斷要執行的檔案類型 跟交割日期  */
			if (null == args || 0 == args.length)
			{
				/* 處理系統日當日所有類型 */
				job.execute();
			}
			else
			{
				/* 指定通路 自動抓 */
				if (1 == args.length)
				{					

					try {
						/* 指定檔案類型， */
						int arg0=Integer.parseInt(args[0]);
						
						String fileFormat=PaymentTable_Field.get(arg0);

						if(StringUtils.isNotEmpty(fileFormat)){
							/* 處理  系統日當日 指定類型 args[0]*/
							job.execute(arg0,new Date());
						}else{
							throw new RuntimeException("指定通路參數 "+ args[0]+" 無法取得對應的處理類型");
						}
					} catch (RuntimeException e) {
						logger.error(e.getMessage(), e);
						throw new RuntimeException("invalide frist argument, must be number");

					}

				}
				else
				{
					if (2 == args.length){

						try {

							/* 指定通路參數[0]，指定日期參數[1]*/
							int arg0=Integer.parseInt(args[0]);						
							String fileFormat=PaymentTable_Field.get(arg0);
							/* 指定交割日期 */  
							Date deliveryDate = null;
							try {
								deliveryDate = new SimpleDateFormat("yyyyMMdd").parse(args[1]);
							} catch (Exception e) {
								throw new RuntimeException("指定日期格式錯誤，應為 yyyyMMdd，例如 : 20120813");
							}
							if(StringUtils.isNotEmpty(fileFormat)){
								/* 處理 指定類型args[0]  指定日期args[1]  */
								job.execute(arg0, deliveryDate);

							}else{
								throw new RuntimeException("指定通路參數 "+ args[0]+" 指定時間"+ args[1]+"無法取得對應的處理類型");
							}
						} catch (RuntimeException e) {
							logger.error(e.getMessage(), e);
							throw new RuntimeException("invalide frist argument, must be number");

						}

					}	
				}
			}



		}
		catch (Exception e)
		{
			logger.error(e.getMessage(), e);
		}
		finally
		{
			Date end = new Date();
			logger.info("[結束]  批次 - {}", BASIC_DATE_TIME_FORMAT.format(end));
			logger.info("共費時 - " + ((end.getTime() - start.getTime()) / 1000) + " 秒");

		}
	}

	/**
	 * 執行批次
	 * @throws Exception 
	 */
	public void execute() throws Exception
	{			

		
		Date sysDate=new  Date();
		logger.info("取得執行日期-系統日期：{}", sysDate);	
		this.execute(0,sysDate);

	}

	/**
	 * 執行批次
	 * @throws Exception 
	 */
	public void execute(int fileformat,Date tranferDate) throws Exception
	{

	
		List<Payment> todos=new ArrayList<Payment>();
	

		/**
		 * 1.每日批次 輸入一個傳輸日期 扣一入多
		 *   1-1 作超商扣P1003_eBilling_yyyymmdd.TXT 當天若有10家業者要撥款，若這10家業者4超商皆有回饋，撥款照理說會有40筆款項
		 *   但扣款就是這40筆加總成為一筆扣掉，也就是說扣款檔只會有一筆，備註寫「超商XXX筆」(XXX不是40筆，是代收筆數的量)。
		 *   1-2 作超商撥P1003_eBilling_yyyymmdd.TXT 入多 「統一」+「xxxxxx」+「筆」
			 1-3 郵局 A1002_eBilling_yyyymmdd.TXT 扣多入多
		 */
		 todos = getToDos(fileformat,tranferDate);
		/* 2. 畫面上區間傳輸日期(fb_time) group by 帳單業者*/ 
		
		 //  P1003
		 
		 // EX 元智 統一 2筆  全家 2筆 
		 //    中租 統一 2筆  全家 2筆
		 //
		 
		 todos = getToDos(fileformat,tranferDate);
		/* 3. 畫面上區間撥款日期	*/
		 todos = getToDos(fileformat,tranferDate);
		 
	

		if (null == todos || 0 == todos.size())
		{
			

			todos = null;
			return; /* 終止執行 */
		}

		
	

		makeCVSFile(todos,tranferDate);

		makePOSTFile(todos,tranferDate);


		/* free resource */
		if (null != todos)
		{
			todos.clear();
			todos = null;
		}

	}


	
	
	private void makePOSTFile(List<Payment>  todo  ,Date tranferDate)  {


	}
	
	private void makeCVSFile(List<Payment>  todo  ,Date tranferDate)  {

		logger.info("產生  撥款日期[{}] 撥款檔案({}) [開始]",  dateFormat.format(tranferDate));

		SimpleDateFormat yyyymmdd = new SimpleDateFormat("yyyyMMdd");
		/* 資料夾改成傳送日  SysDate,方便查詢 */
		String localFolder = backupBaseDirectory + "/P55RequestJob/" + yyyymmdd.format(new Date());
		//產黨
		String sLocalFilePath =null; //p55RequestJobService.makeToUploadFile(todo, localFolder);
		if (StringUtils.isEmpty(sLocalFilePath))
			throw new RuntimeException("["+ "檔名" +"] 產生檔案失敗。撥款日期 = " + tranferDate);

	
		/* 上傳至 FTP Server*/

		File localFile = new File(sLocalFilePath);
		String sRemoteFileName = localFile.getName();
		/* 更新 UploadFile.FileNmae = sRemoteFileName */
		//TODO
		
		logger.info("產生  日期[{}] 撥款檔案({}) [結束]",  dateFormat.format(tranferDate));


	}




	private String eDateToCDateDate(Date date)
	{

		// 日期轉民國年
		DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
		String cDate = String.valueOf(Integer.parseInt(dateFormat.format(date)) - 19110000);

		if (cDate.length() < 7)
			cDate = "0"+ cDate;

		return cDate;
	}

	
	private List<Payment> getToDos(int fileformat,Date deliveryDate) 
	{
		return null;
	}



	/**
	 * 將數值轉為字串[9(11)] 共11碼
	 * @param amount
	 * @return
	 */
	private String genAmountString(BigDecimal amount)
	{
		if (null == amount)
		{
			return "00000000000"; //11碼
		}

		StringBuffer result = new StringBuffer();
		amount.setScale(0,BigDecimal.ROUND_DOWN); // 無條件捨去
		String sAmount = amount.toString();
		String[] sarry = sAmount.split("\\.");
		// 交易金額整數位
		byte[] tempBytes = sarry[0].getBytes();					
		if (11 != tempBytes.length)
		{
			byte[] tb = new byte[11];
			for(int i=0; i<11; i++)
			{
				tb[i] = '0';
			}

			System.arraycopy(tempBytes, 0, tb, 11 - tempBytes.length , tempBytes.length);
			tempBytes = tb;
		}
		result.append(new String(tempBytes));

		/*	if (sarry.length > 1) // 代表有小數
		{
			// 交易金額小數位
			tempBytes = sarry[1].getBytes();					
			if (2 != tempBytes.length)
			{
				byte[] tb = new byte[2];
				for(int i=0; i<2; i++)
				{
					tb[i] = '0';
				}

				System.arraycopy(tempBytes, 0, tb, 0 , tempBytes.length);
				tempBytes = tb;
			}
			result.append(new String(tempBytes));
		}
		else
			result.append("00");*/


		return result.toString();
	}


}
